Saving Graphs to File
- Don’t use the mouse
- Use
ggsave for ggplot
- Practice by saving the following plot to file:
p <- ggplot(mtcars, aes(hp, wt)) +
geom_point()
ggsave("my_plot.png", p)
- Base R way: print plots “to screen”, sandwiched between
pdf()/jpeg()/png()… and dev.off().
- Vector vs. raster: Images are stored on your computer as either vector or raster.
Scales; Colour
Scale functions in ggplot2 take the form scale_[aesthetic]_[mapping]().
Let’s first focus on the following plot:

- Change the y-axis tick mark spacing to 10; change the colour spacing to include all powers of 10.

- Specify
scales::*_format in the labels argument of a scale function to do the following:
- Change the x-axis labels to dollar format (use
scales::dollar_format())
- Change the colour labels to comma format (use
scales::comma_format())

- Use
RColorBrewer to change the colour scheme.
- Notice the three different types of scales: sequential, diverging, and continuous.

- Use
viridis to change the colour to a colour-blind friendly scheme
- Hint: add
scale_colour_viridis_c (c stands for continuous; d discrete).
- You can choose a palette with
option.

Theming
Changing the look of a graphic can be achieved through the theme() layer.
There are “complete themes” that come with ggplot2, my favourite being theme_bw (I’ve grown tired of the default gray background, so theme_bw is refreshing).
- Change the theme of the following plot to
theme_bw():

- Then, change font size of axis labels, and the strip background colour. Others?

Plotly
Consider the following plot:

- Convert it to a
plotly object by applying the ggplotly() function:
- You can save a plotly graph locally as an html file. Try saving the above:
- NOTE: plotly graphs don’t seem to show up in Rmd notebooks, but they do with Rmd documents.
p %>%
ggplotly() %>%
htmlwidgets::saveWidget("LOCATION_GOES_HERE")
- Run this code to see the json format underneath:
p %>%
ggplotly() %>%
plotly_json()
Error: Package `listviewer` required for `plotly_json`.
Please install and try again.
- Check out code to make a plotly object from scratch using
plot_ly() – scatterplot of gdpPercap vs lifeExp.
- Add population to form a z-axis for a 3D plot:
LS0tDQp0aXRsZTogImNtMDEzIEV4ZXJjaXNlIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQoNCi0tLQ0KDQpgYGB7cn0NCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHRpZHl2ZXJzZSkpDQpsaWJyYXJ5KGdhcG1pbmRlcikNCmBgYA0KDQoNCiMgU2F2aW5nIEdyYXBocyB0byBGaWxlDQoNCi0gRG9uJ3QgdXNlIHRoZSBtb3VzZQ0KLSBVc2UgYGdnc2F2ZWAgZm9yIGdncGxvdA0KICAgIC0gUHJhY3RpY2UgYnkgc2F2aW5nIHRoZSBmb2xsb3dpbmcgcGxvdCB0byBmaWxlOiANCg0KYGBge3J9DQpwIDwtIGdncGxvdChtdGNhcnMsIGFlcyhocCwgd3QpKSArIA0KICAgIGdlb21fcG9pbnQoKQ0KZ2dzYXZlKCJteV9wbG90LnBuZyIsIHApDQpgYGANCg0KLSBCYXNlIFIgd2F5OiBwcmludCBwbG90cyAidG8gc2NyZWVuIiwgc2FuZHdpY2hlZCBiZXR3ZWVuIGBwZGYoKWAvYGpwZWcoKWAvYHBuZygpYC4uLiBhbmQgYGRldi5vZmYoKWAuIA0KLSBWZWN0b3IgdnMuIHJhc3RlcjogSW1hZ2VzIGFyZSBzdG9yZWQgb24geW91ciBjb21wdXRlciBhcyBlaXRoZXIgX3ZlY3Rvcl8gb3IgX3Jhc3Rlcl8uDQogICAgLSBfX1Jhc3Rlcl9fOiBhbiBgbmAgYnkgYG1gIGdyaWQgb2YgcGl4ZWxzLCBlYWNoIHdpdGggaXRzIG93biBjb2xvdXIuIGBqcGVnYCwgYHBuZ2AsIGBnaWZgLCBgYm1wYC4NCiAgICAtIF9fVmVjdG9yX186IHJlcHJlc2VudGVkIGFzIHNoYXBlcyBhbmQgbGluZXMuIGBwZGZgLCBbYHN2Z2BdKGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vZ3JhcGhpY3Mvc3ZnX2ludHJvLmFzcCkuDQogICAgLSBGb3IgdGlwczogWyIxMCB0aXBzIGZvciBtYWtpbmcgeW91ciBSIGdyYXBoaWNzIGxvb2sgdGhlaXIgYmVzdCIiXShodHRwOi8vYmxvZy5yZXZvbHV0aW9uYW5hbHl0aWNzLmNvbS8yMDA5LzAxLzEwLXRpcHMtZm9yLW1ha2luZy15b3VyLXItZ3JhcGhpY3MtbG9vay10aGVpci1iZXN0Lmh0bWwpLg0KICAgIA0KIyBTY2FsZXM7IENvbG91cg0KDQpTY2FsZSBmdW5jdGlvbnMgaW4gYGdncGxvdDJgIHRha2UgdGhlIGZvcm0gYHNjYWxlX1thZXN0aGV0aWNdX1ttYXBwaW5nXSgpYC4NCg0KTGV0J3MgZmlyc3QgZm9jdXMgb24gdGhlIGZvbGxvd2luZyBwbG90Og0KDQpgYGB7cn0NCnBfc2NhbGVzIDwtIGdncGxvdChnYXBtaW5kZXIsIGFlcyhnZHBQZXJjYXAsIGxpZmVFeHApKSArDQogICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1wb3ApLCBhbHBoYT0wLjIpDQpwX3NjYWxlcyArIA0KICAgIHNjYWxlX3hfbG9nMTAoKSArDQogICAgc2NhbGVfY29sb3VyX2NvbnRpbnVvdXModHJhbnM9ImxvZzEwIikNCmBgYA0KDQoxLiBDaGFuZ2UgdGhlIHktYXhpcyB0aWNrIG1hcmsgc3BhY2luZyB0byAxMDsgY2hhbmdlIHRoZSBjb2xvdXIgc3BhY2luZyB0byBpbmNsdWRlIGFsbCBwb3dlcnMgb2YgMTAuDQoNCmBgYHtyfQ0KcF9zY2FsZXMgKw0KICAgIHNjYWxlX3hfbG9nMTAoKSArDQogICAgc2NhbGVfY29sb3VyX2NvbnRpbnVvdXMoDQogICAgICAgIHRyYW5zICA9ICJsb2cxMCIsIA0KICAgICAgICBicmVha3MgPSAxMF4oMToxMCkNCiAgICApICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTE6MTAgKiAxMCkNCmBgYA0KDQoyLiBTcGVjaWZ5IGBzY2FsZXM6OipfZm9ybWF0YCBpbiB0aGUgYGxhYmVsc2AgYXJndW1lbnQgb2YgYSBzY2FsZSBmdW5jdGlvbiB0byBkbyB0aGUgZm9sbG93aW5nOg0KICAgIC0gQ2hhbmdlIHRoZSB4LWF4aXMgbGFiZWxzIHRvIGRvbGxhciBmb3JtYXQgKHVzZSBgc2NhbGVzOjpkb2xsYXJfZm9ybWF0KClgKQ0KICAgIC0gQ2hhbmdlIHRoZSBjb2xvdXIgbGFiZWxzIHRvIGNvbW1hIGZvcm1hdCAodXNlIGBzY2FsZXM6OmNvbW1hX2Zvcm1hdCgpYCkNCg0KYGBge3J9DQpsaWJyYXJ5KHNjYWxlcykNCnBfc2NhbGVzICsNCiAgICBzY2FsZV94X2xvZzEwKGxhYmVscz1kb2xsYXJfZm9ybWF0KCkpICsNCiAgICBzY2FsZV9jb2xvdXJfY29udGludW91cygNCiAgICAgICAgdHJhbnMgID0gImxvZzEwIiwgDQogICAgICAgIGJyZWFrcyA9IDEwXigxOjEwKSwNCiAgICAgICAgbGFiZWxzID0gY29tbWFfZm9ybWF0KCkNCiAgICApICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTEwKigxOjEwKSkNCmBgYA0KDQozLiBVc2UgYFJDb2xvckJyZXdlcmAgdG8gY2hhbmdlIHRoZSBjb2xvdXIgc2NoZW1lLg0KICAgIC0gTm90aWNlIHRoZSB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2Ygc2NhbGVzOiBzZXF1ZW50aWFsLCBkaXZlcmdpbmcsIGFuZCBjb250aW51b3VzLg0KDQpgYGB7cn0NCiMjIEFsbCBwYWxldHRlcyB0aGUgY29tZSB3aXRoIFJDb2xvckJyZXdlcjoNClJDb2xvckJyZXdlcjo6ZGlzcGxheS5icmV3ZXIuYWxsKCkNCnBfc2NhbGVzICsNCiAgICBzY2FsZV94X2xvZzEwKGxhYmVscz1kb2xsYXJfZm9ybWF0KCkpICsNCiAgICBzY2FsZV9jb2xvdXJfZGlzdGlsbGVyKA0KICAgICAgICB0cmFucyAgID0gImxvZzEwIiwNCiAgICAgICAgYnJlYWtzICA9IDEwXigxOjEwKSwNCiAgICAgICAgbGFiZWxzICA9IGNvbW1hX2Zvcm1hdCgpLA0KICAgICAgICBwYWxldHRlID0gIkdyZWVucyINCiAgICApICsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPTEwKigxOjEwKSkNCmBgYA0KDQo0LiBVc2UgYHZpcmlkaXNgIHRvIGNoYW5nZSB0aGUgY29sb3VyIHRvIGEgY29sb3VyLWJsaW5kIGZyaWVuZGx5IHNjaGVtZQ0KICAgIC0gSGludDogYWRkIGBzY2FsZV9jb2xvdXJfdmlyaWRpc19jYCAoYGNgIHN0YW5kcyBmb3IgY29udGludW91czsgYGRgIGRpc2NyZXRlKS4NCiAgICAtIFlvdSBjYW4gY2hvb3NlIGEgcGFsZXR0ZSB3aXRoIGBvcHRpb25gLg0KDQpgYGB7cn0NCnBfc2NhbGVzICsNCiAgICBzY2FsZV94X2xvZzEwKGxhYmVscz1kb2xsYXJfZm9ybWF0KCkpICsNCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19jKA0KICAgICAgICB0cmFucyAgID0gImxvZzEwIiwNCiAgICAgICAgYnJlYWtzICA9IDEwXigxOjEwKSwNCiAgICAgICAgbGFiZWxzICA9IGNvbW1hX2Zvcm1hdCgpDQogICAgKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpDQpgYGANCg0KIyBUaGVtaW5nDQoNCkNoYW5naW5nIHRoZSBsb29rIG9mIGEgZ3JhcGhpYyBjYW4gYmUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgYHRoZW1lKClgIGxheWVyLg0KDQpUaGVyZSBhcmUgWyJjb21wbGV0ZSB0aGVtZXMiXShodHRwOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9nZ3RoZW1lLmh0bWwpIHRoYXQgY29tZSB3aXRoIGBnZ3Bsb3QyYCwgbXkgZmF2b3VyaXRlIGJlaW5nIGB0aGVtZV9id2AgKEkndmUgZ3Jvd24gdGlyZWQgb2YgdGhlIGRlZmF1bHQgZ3JheSBiYWNrZ3JvdW5kLCBzbyBgdGhlbWVfYndgIGlzIHJlZnJlc2hpbmcpLg0KDQoxLiBDaGFuZ2UgdGhlIHRoZW1lIG9mIHRoZSBmb2xsb3dpbmcgcGxvdCB0byBgdGhlbWVfYncoKWA6DQoNCmBgYHtyfQ0KZ2dwbG90KGlyaXMsIGFlcyhTZXBhbC5XaWR0aCwgU2VwYWwuTGVuZ3RoKSkgKw0KICAgICBmYWNldF93cmFwKH4gU3BlY2llcykgKw0KICAgICBnZW9tX3BvaW50KCkgKw0KICAgICBsYWJzKHggPSAiU2VwYWwgV2lkdGgiLA0KICAgICAgICAgIHkgPSAiU2VwYWwgTGVuZ3RoIiwNCiAgICAgICAgICB0aXRsZSA9ICJTZXBhbCBzaXplcyBvZiB0aHJlZSBwbGFudCBzcGVjaWVzIikgKw0KICAgICB0aGVtZV9idygpDQpgYGANCg0KMi4gVGhlbiwgY2hhbmdlIGZvbnQgc2l6ZSBvZiBheGlzIGxhYmVscywgYW5kIHRoZSBzdHJpcCBiYWNrZ3JvdW5kIGNvbG91ci4gT3RoZXJzPw0KDQpgYGB7cn0NCmdncGxvdChpcmlzLCBhZXMoU2VwYWwuV2lkdGgsIFNlcGFsLkxlbmd0aCkpICsNCiAgICAgZmFjZXRfd3JhcCh+IFNwZWNpZXMpICsNCiAgICAgZ2VvbV9wb2ludCgpICsNCiAgICAgbGFicyh4ID0gIlNlcGFsIFdpZHRoIiwNCiAgICAgICAgICB5ID0gIlNlcGFsIExlbmd0aCIsDQogICAgICAgICAgdGl0bGUgPSAiU2VwYWwgc2l6ZXMgb2YgdGhyZWUgcGxhbnQgc3BlY2llcyIpICsNCiAgICB0aGVtZV9idygpICsNCiAgICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksDQogICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIm9yYW5nZSIpLA0KICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmV5IikpDQpgYGANCg0KDQojIFBsb3RseQ0KDQpDb25zaWRlciB0aGUgZm9sbG93aW5nIHBsb3Q6DQoNCmBgYHtyfQ0KKHAgPC0gZ2FwbWluZGVyICU+JSANCiAgICAgZmlsdGVyKGNvbnRpbmVudCAhPSAiT2NlYW5pYSIpICU+JSANCiAgICAgZ2dwbG90KGFlcyhnZHBQZXJjYXAsIGxpZmVFeHApKSArDQogICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1wb3ApLCBhbHBoYT0wLjIpICsNCiAgICAgc2NhbGVfeF9sb2cxMChsYWJlbHM9ZG9sbGFyX2Zvcm1hdCgpKSArDQogICAgIHNjYWxlX2NvbG91cl9kaXN0aWxsZXIoDQogICAgICAgICB0cmFucyAgID0gImxvZzEwIiwNCiAgICAgICAgIGJyZWFrcyAgPSAxMF4oMToxMCksDQogICAgICAgICBsYWJlbHMgID0gY29tbWFfZm9ybWF0KCksDQogICAgICAgICBwYWxldHRlID0gIkdyZWVucyINCiAgICAgKSArDQogICAgIGZhY2V0X3dyYXAofiBjb250aW5lbnQpICsNCiAgICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz0xMCooMToxMCkpICsNCiAgICAgdGhlbWVfYncoKSkNCmBgYA0KDQoxLiBDb252ZXJ0IGl0IHRvIGEgYHBsb3RseWAgb2JqZWN0IGJ5IGFwcGx5aW5nIHRoZSBgZ2dwbG90bHkoKWAgZnVuY3Rpb246DQoNCmBgYHtyfQ0KbGlicmFyeShwbG90bHkpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCjIuIFlvdSBjYW4gc2F2ZSBhIHBsb3RseSBncmFwaCBsb2NhbGx5IGFzIGFuIGh0bWwgZmlsZS4gVHJ5IHNhdmluZyB0aGUgYWJvdmU6DQogICAgLSBOT1RFOiBwbG90bHkgZ3JhcGhzIGRvbid0IHNlZW0gdG8gc2hvdyB1cCBpbiBSbWQgX25vdGVib29rc18sIGJ1dCB0aGV5IGRvIHdpdGggUm1kIF9kb2N1bWVudHNfLg0KDQpgYGB7cn0NCnAgJT4lIA0KICAgIGdncGxvdGx5KCkgJT4lIA0KICAgIGh0bWx3aWRnZXRzOjpzYXZlV2lkZ2V0KCJMT0NBVElPTl9HT0VTX0hFUkUiKQ0KYGBgDQoNCg0KMy4gUnVuIHRoaXMgY29kZSB0byBzZWUgdGhlIGpzb24gZm9ybWF0IHVuZGVybmVhdGg6DQoNCmBgYHtyfQ0KcCAlPiUgDQogICAgZ2dwbG90bHkoKSAlPiUgDQogICAgcGxvdGx5X2pzb24oKQ0KYGBgDQoNCg0KNC4gQ2hlY2sgb3V0IGNvZGUgdG8gbWFrZSBhIHBsb3RseSBvYmplY3QgZnJvbSBzY3JhdGNoIHVzaW5nIGBwbG90X2x5KClgIC0tIHNjYXR0ZXJwbG90IG9mIGdkcFBlcmNhcCB2cyBsaWZlRXhwLg0KICAgIC0gQ2hlY2sgb3V0IHRoZSBbY2hlYXQgc2hlZXRdKGh0dHBzOi8vaW1hZ2VzLnBsb3QubHkvcGxvdGx5LWRvY3VtZW50YXRpb24vaW1hZ2VzL3JfY2hlYXRfc2hlZXQucGRmKS4NCg0KYGBge3J9DQpwbG90X2x5KGdhcG1pbmRlciwgDQogICAgICAgIHggPSB+Z2RwUGVyY2FwLCANCiAgICAgICAgeSA9IH5saWZlRXhwLCANCiAgICAgICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwNCiAgICAgICAgb3BhY2l0eSA9IDAuMikgJT4lIA0KICAgIGxheW91dCh4YXhpcyA9IGxpc3QodHlwZSA9ICJsb2ciKSkNCmBgYA0KDQo1LiBBZGQgcG9wdWxhdGlvbiB0byBmb3JtIGEgei1heGlzIGZvciBhIDNEIHBsb3Q6DQoNCmBgYHtyfQ0KcGxvdF9seShnYXBtaW5kZXIsIA0KICAgICAgICB4ID0gfmdkcFBlcmNhcCwgDQogICAgICAgIHkgPSB+bGlmZUV4cCwgDQogICAgICAgIHogPSB+cGxvdCwNCiAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLA0KICAgICAgICBtb2RlID0gIm1hcmtlcnMiLA0KICAgICAgICBvcGFjaXR5ID0gMC4yKQ0KYGBgDQoNCg0KDQo=